package 双指针法;

import com.alibaba.fastjson.JSON;

import java.util.Arrays;

public class No283移动零 {

    /**
     * 给定一个数组 nums，编写一个函数将所有 0 移动到数组的末尾，同时保持非零元素的相对顺序。
     * 示例:
     * 输入: [0,1,0,3,12]
     * 输出: [1,3,12,0,0]
     * 说明:
     * 必须在原数组上操作，不能拷贝额外的数组。
     * 尽量减少操作次数。
     * */

    //并非最优解法,我们还可以把最后的for循环省略掉
    public static void moveZeroes(int[] nums) {
        //利用双指针法
        int zeroIndex=0;//指向前面有效的排序下标
        //当前遍历元素为i
        for(int i=0;i<nums.length;i++){
            if(nums[i]!=0){
                nums[zeroIndex]=nums[i];
                zeroIndex++;
            }
        }
        for(int j=zeroIndex;j<nums.length;j++)
            nums[j]=0;
    }

    //用交换位置的方法,把最后的for循环省略掉
    public static void moveZeroesGood(int[] nums){
        int zeroIndex=0;//指向前面有效的排序下标
        //当前遍历元素为i
        for(int i=0;i<nums.length;i++){
            //不等于才会进去使zeroIndex指针++
            if(nums[i]!=0){
                //如果数组都是非0的话,那么都会自己和自己交换一次位置
                if(i!=zeroIndex) {//只有在两个指针不同时才去交换
                    int temporary = nums[zeroIndex];
                    nums[zeroIndex] = nums[i];
                    nums[i] = temporary;
                    zeroIndex++;
                }else
                    zeroIndex++;//非0元素另一个指针会++,只有找到0才会停止
            }
        }
    }

    public static void main(String[] args) {
        int[] arr=new int[]{0,0,1,2,0,0,4,5,0,7};
        moveZeroesGood(arr);
        System.out.println(JSON.toJSONString(arr));
    }

}
